package handler

import (
	"CampusRecruitment/pkg/apps"
	"CampusRecruitment/pkg/apps/ctx"
	"CampusRecruitment/pkg/models"
	"CampusRecruitment/pkg/types"
	"github.com/gin-gonic/gin"
)

// CreateNews 创建新闻
// @Tags News
// @Summary 创建新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param json body types.CreateNewsForm true "parameter"
// @router /news [POST]
// @Success 200 {object} types.APIResponse{result=models.News}
func CreateNews(c *gin.Context) {
	ac := ctx.New(c)
	form := types.CreateNewsForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.CreateNews(ac, &form))
}

// DeleteNewsById 删除新闻
// @Tags News
// @Summary 删除新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "news id"
// @router /news/{id} [DELETE]
// @Success 200 {object} types.APIResponse{result=resps.DeleteNewsByIdResp}
func DeleteNewsById(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.DeleteNewsById(ac, models.Id(c.Param("id"))))
}

// UpdateNewsById 通过id修改新闻
// @Tags News
// @Summary 通过id修改新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "news id"
// @Param json body types.UpdateNewsForm true "parameter"
// @router /news/{id} [PUT]
// @Success 200 {object} types.APIResponse{result=models.News}
func UpdateNewsById(c *gin.Context) {
	ac := ctx.New(c)
	form := types.UpdateNewsForm{}
	form.Id = models.Id(c.Param("id"))
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.UpdateNewsById(ac, &form))
}

// GetNewsList 获取已发布新闻列表
// @Tags News
// @Summary 获取已发布新闻列表
// @Accept json
// @Produce json
// @Security AuthToken
// @Param form query types.GetNewsListForm true "parameter"
// @router /news/list [GET]
// @Success 200 {object} types.APIResponse{result=[]resps.GetNewsListResp}
func GetNewsList(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsListForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetNewsList(ac, &form))
}

// GetAllNews 获取所有新闻列表(管理员)
// @Tags News
// @Summary 获取所有新闻列表(管理员)
// @Accept json
// @Produce json
// @Security AuthToken
// @Param form query types.GetNewsListForm true "parameter"
// @router /news/all [GET]
// @Success 200 {object} types.APIResponse{result=[]resps.GetNewsListResp}
func GetAllNews(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsListForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetAllNews(ac, &form))
}

// ApproveNews 审批新闻
// @Tags News
// @Summary 审批新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "parameter"
// @router /news/{id}/approve [GET]
// @Success 200
func ApproveNews(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.NewsApprove(ac, models.Id(c.Param("id"))))
}

// CloseNews 关闭新闻
// @Tags News
// @Summary 关闭新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "parameter"
// @router /news/{id}/close [GET]
// @Success 200
func CloseNews(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.CloseNews(ac, models.Id(c.Param("id"))))
}

// OpenNews 开启新闻（新闻发布者）
// @Tags News
// @Summary 开启新闻（新闻发布者）
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "parameter"
// @router /news/{id}/open [GET]
// @Success 200
func OpenNews(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.OpenNews(ac, models.Id(c.Param("id"))))
}

// GetNewsContent 获取新闻详情
// @Tags News
// @Summary 获取已发布新闻列表
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "parameter"
// @router /news/{id}/content [GET]
// @Success 200
func GetNewsContent(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.GetNewsContent(ac, models.Id(c.Param("id"))))
}

// GetMyNews 获取个人发布的资讯
// @Tags News
// @Summary 获取个人发布的资讯
// @Accept json
// @Produce json
// @Security AuthToken
// @Param form query types.GetNewsListForm true "parameter"
// @router /news/list [GET]
// @Success 200 {object} types.APIResponse{result=[]resps.GetNewsListResp}
func GetMyNews(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetMyNewsForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetMyNews(ac, &form))
}
